home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The 640 MEG Shareware Studio 2
/
The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO
/
os2
/
pccts.zip
/
ANTLR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-08
|
19KB
|
912 lines
/*
* A n t l r T r a n s l a t i o n H e a d e r
*
* Terence Parr, Hank Dietz and Will Cohen: 1989-1992
* Purdue University Electrical Engineering
* ANTLR Version 1.06
*/
#include <stdio.h>
#include "set.h"
#include <ctype.h>
#include "syn.h"
#include "hash.h"
#include "generic.h"
#define zzcr_attr(attr,tok,t)
#include "antlr.h"
#include "tokens.h"
#include "dlgdef.h"
#include "mode.h"
ANTLR_INFO
#ifdef __STDC__
static void chkToken(char *, char *, char *);
#else
static void chkToken();
#endif
#ifdef __STDC__
void
grammar()
#else
grammar()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
Graph g;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==50) ) {
zzmatch(50); zzCONSUME;
zzmatch(Action);
HdrAction = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(HdrAction!=NULL, "rule grammar: cannot allocate header action");
strcpy(HdrAction, LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
char *a;
while ( 1 ) {
if ( (LA(1)==Action) ) {
zzmatch(Action);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule grammar: cannot allocate action");
strcpy(a, LATEXT(1));
list_add(&BeforeActions, a);
zzCONSUME;
}
else if ( (LA(1)==57) ) {
laction();
}
else if ( (LA(1)==58) ) {
aLexclass();
}
else if ( (LA(1)==63) ) {
token();
}
else if ( (LA(1)==60) ) {
error();
}
else break;
zzLOOP(zztasp2);
}
zzEXIT(zztasp2);
}
}
rule();
g=zzaArg(zztasp1,3); SynDiag = (Junction *) zzaArg(zztasp1,3 ).left;
{
zzBLOCK(zztasp2);
zzMake0;
{
while ( 1 ) {
if ( (LA(1)==NonTerminal) ) {
rule();
if ( zzaArg(zztasp2,1 ).left!=NULL ) {g.right = NULL; g = Or(g, zzaArg(zztasp2,1));}
}
else if ( (LA(1)==58) ) {
aLexclass();
}
else if ( (LA(1)==63) ) {
token();
}
else if ( (LA(1)==60) ) {
error();
}
else break;
zzLOOP(zztasp2);
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
char *a;
while ( 1 ) {
if ( (LA(1)==Action) ) {
zzmatch(Action);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule grammar: cannot allocate action");
strcpy(a, LATEXT(1));
list_add(&AfterActions, a);
zzCONSUME;
}
else if ( (LA(1)==57) ) {
laction();
}
else if ( (LA(1)==60) ) {
error();
}
else break;
zzLOOP(zztasp2);
}
zzEXIT(zztasp2);
}
}
zzmatch(Eof); zzCONSUME;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
CannotContinue=TRUE;
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x1);
}
}
#ifdef __STDC__
void
rule()
#else
rule()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
RuleEntry *q; Junction *p; Graph r; int f, l; ECnode *e;
char *pdecl=NULL, *ret=NULL, *a;
zzmatch(NonTerminal);
q=NULL;
if ( hash_get(Rname, LATEXT(1))!=NULL ) {
warn(eMsg1("duplicate rule definition: '%s'",LATEXT(1)))
CannotContinue=TRUE;
}
else
{
q = (RuleEntry *)hash_add(Rname,
LATEXT(1),
(Entry *)newRuleEntry(LATEXT(1)));
CurRule = q->str;
}
CurRuleNode = q;
f = CurFile; l = zzline;
NumRules++;
zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==52) ) {
zzmatch(52);
if ( q!=NULL ) q->noAST = TRUE;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
;
if ( (setwd1[LA(1)]&0x2) ) {
{
zzBLOCK(zztasp3);
zzMake0;
{
if ( (LA(1)==53) ) {
zzmatch(53); zzCONSUME;
}
zzEXIT(zztasp3);
}
}
zzmatch(PassAction);
pdecl = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(pdecl!=NULL, "rule rule: cannot allocate param decl");
strcpy(pdecl, LATEXT(1));
CurParmDef = pdecl;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==54) ) {
zzmatch(54); zzCONSUME;
zzmatch(PassAction);
ret = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(ret!=NULL, "rule rule: cannot allocate ret type");
strcpy(ret, LATEXT(1));
CurRetDef = ret;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==QuotedTerm) ) {
zzmatch(QuotedTerm);
if ( q!=NULL ) q->egroup=strdup(LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
if ( GenEClasseForRules && q!=NULL ) {
e = newECnode;
require(e!=NULL, "cannot allocate error class node");
if ( q->egroup == NULL ) {a = q->str; a[0] = toupper(a[0]);}
else a = q->egroup;
if ( Tnum( a ) == 0 )
{
e->tok = addTname( a );
list_add(&eclasses, (char *)e);
if ( q->egroup == NULL ) a[0] = tolower(a[0]);
/* refers to itself */
list_add(&(e->elist), strdup(q->str));
}
else {
warn(eMsg1("default errclass for '%s' would conflict with token/errclass",a));
if ( q->egroup == NULL ) a[0] = tolower(a[0]);
free(e);
}
}
BlkLevel++;
zzmatch(55); zzCONSUME;
block();
r = makeBlk(zzaArg(zztasp1,7));
((Junction *)r.left)->jtype = RuleBlk;
if ( q!=NULL ) ((Junction *)r.left)->rname = q->str;
((Junction *)r.left)->file = f;
((Junction *)r.left)->line = l;
((Junction *)r.left)->pdecl = pdecl;
((Junction *)r.left)->ret = ret;
((Junction *)r.left)->lock = makelocks();
((Junction *)r.left)->pred_lock = makelocks();
p = newJunction(); /* add EndRule Node */
((Junction *)r.right)->p1 = (Node *)p;
r.right = (Node *) p;
p->jtype = EndRule;
p->lock = makelocks();
p->pred_lock = makelocks();
((Junction *)r.left)->end = p;
if ( q!=NULL ) q->rulenum = NumRules;
zzaArg(zztasp1,7) = r;
--BlkLevel;
zzmatch(56); zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==Action) ) {
zzmatch(Action);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule rule: cannot allocate error action");
strcpy(a, LATEXT(1));
((Junction *)r.left)->erraction = a;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
if ( q==NULL ) zzaArg(zztasp1,0 ).left = NULL; else zzaArg(zztasp1,0) = zzaArg(zztasp1,7);
CurRuleNode = NULL;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
CannotContinue=TRUE;
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x4);
}
}
#ifdef __STDC__
void
laction()
#else
laction()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
char *a;
zzmatch(57); zzCONSUME;
zzmatch(Action);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule laction: cannot allocate action");
strcpy(a, LATEXT(1));
list_add(&LexActions, a);
zzCONSUME;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x8);
}
}
#ifdef __STDC__
void
aLexclass()
#else
aLexclass()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
zzmatch(58); zzCONSUME;
zzmatch(TokenTerm);
lexclass(strdup(LATEXT(1)));
zzCONSUME;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x10);
}
}
#ifdef __STDC__
void
error()
#else
error()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
char *t=NULL; ECnode *e; int go=1; TermEntry *p;
zzmatch(60); zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
;
if ( (LA(1)==TokenTerm) ) {
zzmatch(TokenTerm);
t=strdup(LATEXT(1));
zzCONSUME;
}
else if ( (LA(1)==QuotedTerm) ) {
zzmatch(QuotedTerm);
t=strdup(LATEXT(1));
zzCONSUME;
}
else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp2);
}
}
e = newECnode;
require(e!=NULL, "cannot allocate error class node");
e->lexclass = CurrentLexClass;
if ( Tnum( (t=StripQuotes(t)) ) == 0 )
{
if ( hash_get(Texpr, t) != NULL )
warn(eMsg1("errclass name conflicts with regular expression '%s'",t));
e->tok = addTname( t );
require((p=(TermEntry *)hash_get(Tname, t)) != NULL,
"hash table mechanism is broken");
p->errclassname = 1; /* entry is errclass name, not token */
list_add(&eclasses, (char *)e);
}
else
{
warn(eMsg1("redefinition of errclass or conflict w/token '%s'; ignored",t));
free( e );
go=0;
}
zzmatch(61); zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==NonTerminal) ) {
zzmatch(NonTerminal);
if ( go ) t=strdup(LATEXT(1));
zzCONSUME;
}
else if ( (LA(1)==TokenTerm) ) {
zzmatch(TokenTerm);
if ( go ) t=strdup(LATEXT(1));
zzCONSUME;
}
else if ( (LA(1)==QuotedTerm) ) {
zzmatch(QuotedTerm);
if ( go ) t=strdup(LATEXT(1));
zzCONSUME;
}
else {zzFAIL(1,zzerr2,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp2);
}
}
if ( go ) list_add(&(e->elist), t);
{
zzBLOCK(zztasp2);
zzMake0;
{
while ( (setwd1[LA(1)]&0x20) ) {
{
zzBLOCK(zztasp3);
zzMake0;
{
if ( (LA(1)==NonTerminal) ) {
zzmatch(NonTerminal);
if ( go ) t=strdup(LATEXT(1));
zzCONSUME;
}
else if ( (LA(1)==TokenTerm) ) {
zzmatch(TokenTerm);
if ( go ) t=strdup(LATEXT(1));
zzCONSUME;
}
else if ( (LA(1)==QuotedTerm) ) {
zzmatch(QuotedTerm);
if ( go ) t=strdup(LATEXT(1));
zzCONSUME;
}
else {zzFAIL(1,zzerr3,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp3);
}
}
if ( go ) list_add(&(e->elist), t);
zzLOOP(zztasp2);
}
zzEXIT(zztasp2);
}
}
zzmatch(62); zzCONSUME;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x40);
}
}
#ifdef __STDC__
void
token()
#else
token()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
char *t=NULL, *e=NULL, *a=NULL;
zzmatch(63); zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==TokenTerm) ) {
zzmatch(TokenTerm);
t=strdup(LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==QuotedTerm) ) {
zzmatch(QuotedTerm);
e=strdup(LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==Action) ) {
zzmatch(Action);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule token: cannot allocate action");
strcpy(a, LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
chkToken(t, e, a);
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
CannotContinue=TRUE;
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x80);
}
}
#ifdef __STDC__
void
block()
#else
block()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
Graph g, b;
alt();
b = g = zzaArg(zztasp1,1);
if ( ((Junction *)g.left)->p1->ntype == nAction )
{
if ( !((ActionNode *)(((Junction *)g.left)->p1))->is_predicate )
{
((ActionNode *)(((Junction *)g.left)->p1))->init_action = TRUE;
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
while ( (LA(1)==64) ) {
zzmatch(64); zzCONSUME;
alt();
g = Or(g, zzaArg(zztasp2,2));
zzLOOP(zztasp2);
}
zzEXIT(zztasp2);
}
}
zzaArg(zztasp1,0) = b;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
CannotContinue=TRUE;
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x100);
}
}
#ifdef __STDC__
void
alt()
#else
alt()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
int n=0; Graph g; g.left=g.right=NULL;
{
zzBLOCK(zztasp2);
zzMake0;
{
while ( (setwd1[LA(1)]&0x200) ) {
element();
n++; g = Cat(g, zzaArg(zztasp2,1));
zzLOOP(zztasp2);
}
zzEXIT(zztasp2);
}
}
if ( n == 0 ) g = emptyAlt();
zzaArg(zztasp1,0) = g;
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
CannotContinue=TRUE;
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x400);
}
}
#ifdef __STDC__
void
element()
#else
element()
#endif
{
zzRULE;
zzBLOCK(zztasp1);
zzMake0;
{
TokNode *p; RuleRefNode *q;
if ( (LA(1)==TokenTerm) ) {
zzmatch(TokenTerm);
zzaArg(zztasp1,0) = buildToken(LATEXT(1));
zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
p = (TokNode *) ((Junction *)zzaRet.left)->p1;
if ( (LA(1)==65) ) {
zzmatch(65);
p->astnode=ASTroot;
zzCONSUME;
}
else if ( (setwd1[LA(1)]&0x800) ) {
p->astnode=ASTchild;
}
else if ( (LA(1)==52) ) {
zzmatch(52);
p->astnode=ASTexclude;
zzCONSUME;
}
else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp2);
}
}
}
else if ( (LA(1)==QuotedTerm) ) {
zzmatch(QuotedTerm);
zzaArg(zztasp1,0) = buildToken(LATEXT(1));
zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
p = (TokNode *) ((Junction *)zzaRet.left)->p1;
if ( (LA(1)==65) ) {
zzmatch(65);
p->astnode=ASTroot;
zzCONSUME;
}
else if ( (setwd1[LA(1)]&0x1000) ) {
p->astnode=ASTchild;
}
else if ( (LA(1)==52) ) {
zzmatch(52);
p->astnode=ASTexclude;
zzCONSUME;
}
else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp2);
}
}
}
else if ( (LA(1)==NonTerminal) ) {
zzmatch(NonTerminal);
zzaArg(zztasp1,0) = buildRuleRef(LATEXT(1));
zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==52) ) {
zzmatch(52);
q = (RuleRefNode *) ((Junction *)zzaRet.left)->p1;
q->astnode=ASTexclude;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (setwd1[LA(1)]&0x2000) ) {
{
zzBLOCK(zztasp3);
zzMake0;
{
if ( (LA(1)==53) ) {
zzmatch(53); zzCONSUME;
}
zzEXIT(zztasp3);
}
}
zzmatch(PassAction);
addParm(((Junction *)zzaRet.left)->p1, LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
char *a; RuleRefNode *rr=(RuleRefNode *) ((Junction *)zzaRet.left)->p1;
if ( (LA(1)==54) ) {
zzmatch(54); zzCONSUME;
zzmatch(PassAction);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule element: cannot allocate assignment");
strcpy(a, LATEXT(1));
rr->assign = a;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
}
else if ( (LA(1)==Action) ) {
zzmatch(Action);
zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 0);
zzCONSUME;
}
else if ( (LA(1)==Pred) ) {
zzmatch(Pred);
zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 1);
zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
char *a; ActionNode *act = (ActionNode *) ((Junction *)zzaRet.left)->p1;
if ( (LA(1)==PassAction) ) {
zzmatch(PassAction);
a = calloc(strlen(LATEXT(1))+1, sizeof(char));
require(a!=NULL, "rule element: cannot allocate predicate fail action");
strcpy(a, LATEXT(1));
act->pred_fail = a;
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
}
else if ( (LA(1)==66) ) {
BlkLevel++;
zzmatch(66); zzCONSUME;
block();
zzaArg(zztasp1,0) = zzaArg(zztasp1,2); --BlkLevel;
zzmatch(67); zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==68) ) {
zzmatch(68);
zzaRet = makeLoop(zzaRet);
zzCONSUME;
}
else if ( (LA(1)==69) ) {
zzmatch(69);
zzaRet = makePlus(zzaRet);
zzCONSUME;
}
else if ( (setwd1[LA(1)]&0x4000) ) {
zzaRet = makeBlk(zzaRet);
}
else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp2);
}
}
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==PassAction) ) {
zzmatch(PassAction);
addParm(((Junction *)zzaRet.left)->p1, LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
}
else if ( (LA(1)==61) ) {
BlkLevel++;
zzmatch(61); zzCONSUME;
block();
zzaArg(zztasp1,0) = makeOpt(zzaArg(zztasp1,2)); --BlkLevel;
zzmatch(62); zzCONSUME;
{
zzBLOCK(zztasp2);
zzMake0;
{
if ( (LA(1)==PassAction) ) {
zzmatch(PassAction);
addParm(((Junction *)zzaRet.left)->p1, LATEXT(1));
zzCONSUME;
}
zzEXIT(zztasp2);
}
}
}
else if ( (LA(1)==55) ) {
zzmatch(55);
warn(eMsg1("missing ';' on rule %s", CurRule));
CannotContinue=TRUE;
zzCONSUME;
}
else if ( (LA(1)==68) ) {
zzmatch(68);
warn("don't you want a ')' with that '*'?"); CannotContinue=TRUE;
zzCONSUME;
}
else if ( (LA(1)==69) ) {
zzmatch(69);
warn("don't you want a ')' with that '+'?"); CannotContinue=TRUE;
zzCONSUME;
}
else if ( (LA(1)==54) ) {
zzmatch(54);
warn("'>' can only appear after a nonterminal"); CannotContinue=TRUE;
zzCONSUME;
}
else if ( (LA(1)==PassAction) ) {
zzmatch(PassAction);
warn("[...] out of context 'rule > [...]'");
CannotContinue=TRUE;
zzCONSUME;
}
else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
zzEXIT(zztasp1);
return;
fail:
zzEXIT(zztasp1);
CannotContinue=TRUE;
zzsyn(zzMissText, zzBadTok, "", zzMissSet, zzMissTok, zzErrk, zzBadText);
zzresynch(setwd1, 0x8000);
}
}
/* semantics of #token */
static void
chkToken(t,e,a)
char *t, *e, *a;
{
if ( t==NULL && e==NULL ) { /* none found */
warn("#token requires at least token name or rexpr");
}
else if ( t!=NULL && e!=NULL ) { /* both found */
Tlink(t, e);
if ( a!=NULL ) {
if ( hasAction(e) ) {
warn(eMsg1("redefinition of action for %s; ignored",e));
}
else setHasAction(e, a);
}
}
else if ( t!=NULL ) { /* only one found */
if ( Tnum( t ) == 0 ) addTname( t );
else {
warn(eMsg1("redefinition of token %s; ignored",t));
}
if ( a!=NULL ) {
warn(eMsg1("action cannot be attached to a token name (%s); ignored",t));
}
}
else if ( e!=NULL ) {
if ( Tnum( e ) == 0 ) addTexpr( e );
else {
if ( hasAction(e) ) {
warn(eMsg1("redefinition of action for %s; ignored",e));
}
else if ( a==NULL ) {
warn(eMsg1("redefinition of expr %s; ignored",e));
}
}
if ( a!=NULL ) setHasAction(e, a);
}
}